# 自定义函数可以返回多个值

def 函数():
    return 1, 2.4, "是"  # 返回多个值 (返回类型没有限制)


值1, 值2, 值3 = 函数()   # 接收函数返回的3个值
print(f'接收函数返回的3个值分别是:{值1} {值2} {值3}')
print()

"""
函数有4种常用的使用方式
1.位置参数
2.关键字参数
3.缺省参数
4.不定长参数
"""

"""
特别说明: 混合使用参数,传参时
python 先匹配 位置实参和关键字实参, 在匹配不定长实参
使用函数里,形参位置不要错,默认参数和不定长参数 要在后面
位置形参 > 关键字形参 > 默认形参 > 不定长形参
"""

"""
1.位置参数 调用函数时根据函数定义的 参数位置来传递参数
注意 传递参数和定义参数的顺序和数量必须一致
"""


def 个人信息(姓名, 年龄, 性别):
    print(f'您的姓名是:{姓名} 年龄:{年龄} 性别:{性别}')


个人信息("孙新罡", 37, "男")  # 传递的参数位置和数量必须和函数的参数一致
print()

"""
2.关键字参数 函数调用时通过 "关键字=值" 的形式传递参数
好处 函数参数更加清晰,同时没有顺序要求
注意 调用函数时如果有位置参数时,位置参数必须在关键字参数前面,但关键字参数不存在先后顺序 
"""


def 个人信息(姓名, 年龄, 性别):
    print(f'您的姓名是:{姓名} 年龄:{年龄} 性别:{性别}')


# 可以不按照顺序
个人信息(性别="男", 年龄=37, 姓名="孙新罡")

# 可以和位置参数混用,位置参数必须在前,且匹配参数顺序
个人信息("孙新罡", 性别="男", 年龄=37, )
print()

"""
缺省参数 缺省参数也叫默认参数. 用于定义函数,为参数提供默认值,调用函数时可不传该默认参数值 
作用 当调用函数时没有传递参数,就会使用默认参数对应的值 
注意 所有位置参数必须出现在默认参数前,包括函数定义和调用 
 函数调用时 如果为缺省参数传递 数值,则修改默认参数值.  否则使用这个默认参数的值 
"""


def 个人信息(姓名, 年龄, 性别="男"):  # 注意 所有位置参数必须出现在默认参数前,包括函数定义和调用
    print(f'您的姓名是:{姓名} 年龄:{年龄} 性别:{性别}')


# 函数调用时 如果为缺省参数传递 数值,则修改默认参数值.  否则使用这个默认参数的值
个人信息("孙新罡", 37)  # 最后第三个参数没有写
个人信息("孙新罡", 37, "男人")  # 传了第三个参数 就不管默认参数值了

print()

"""
4.不定长参数 不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)
作用 当调用函数时不确定参数个数时,可以使用不定长参数 
不定长参数的类型
1.位置传递 的不定长    *变量名 表示
2.关键字传递 的不定长  **变量名 表示
"""


# 注意 传递的所有参数都会被变量收集,它会根据传进参数的位置合并为一个元组,这个变量是元祖类型.  这就是位置传递 的不定长
def 位置参数不定长(*args):  # *是位置参数不定长的表示 也就是不定参数个数   args 这个名字是个规范,不是强制要求
    print(f'接收到的数据有:{args},数据类型是{type(args)}')  # 这个变量是 元组类型


位置参数不定长(2, 44, 55, "等")  # 元组类型


# 参数是"关键字=值"形式 传递的情况下,所有键值会被变量接收,同时根据"关键字=值"组成字典.  所以变量是字典类型
def 关键字参数不定长(**kwargs):  # **是关键字参数不定长的表示 也就是不定参数个数     kwargs 这个名字是个规范,不是强制要求
    print(f'接收到的数据有:{kwargs},数据类型是{type(kwargs)}')  # 这个变量是 字典类型


关键字参数不定长(姓名="张岩", 年龄=38, 性别="男")  # 字典类型
print()


# 函数自身也可以作为参数,到另一个函数里
def 相加(a, b):
    数 = a + b
    return 数


def 运算(a, b):
    数 = 相加(a, b)  # 套用 相加 函数,进来 (函数嵌套)
    print(f'相加计算结果是:{数}')


运算(6, 5)  # 结果是11


"""
匿名函数 lambda 

def关键字 可以定义带有名字的函数 
有名称的函数可以基于名称 重复使用

lambda关键字 可以定义匿名函数(无名称) 
无名称的匿名函数只可临时使用一次 
语法:
lambda 传入的参数 : 函数体 (只能是一行代码)
"""

def 运算(相减):  # 把匿名函数 传给变量参数
    数 = 相减(5, 9)  # 套用 匿名函数,进来 (函数嵌套)
    print(f'相减计算结果是:{数}')


运算(lambda a, b: a - b)  # 匿名函数写法, 在把这个匿名函数当参数   
